package com.xiaoyg.collection.list;

import java.util.Enumeration;
import java.util.Vector;

/**
 * @author xiaoyg
 * @Title: VectorTest
 * @ProjectName jdk-source-debugging
 * @Description: TODO
 * @date 2019/3/1811:44
 */
public class VectorTest {


   /*
    Vector是线程安全的集合类，ArrayList并不是线程安全的类。Vector类对集合的元素操作时都加了synchronized，保证线程安全。
    Vector与ArrayList本质上都是一个Object[] 数组，ArrayList提供了size属性，Vector提供了elementCount属性，他们的作用是记录集合内有效元素的个数。与我们平常调用的arrayList.size()和vector.size()一样返回的集合内有效元素的个数。
    Vector与ArrayList的扩容并不一样，Vector默认扩容是增长一倍的容量，Arraylist是增长50%的容量。
    Vector与ArrayList的remove,add(index,obj)方法都会导致内部数组进行数据拷贝的操作，这样在大数据量时，可能会影响效率。
    Vector与ArrayList的add(obj)方法，如果新增的有效元素个数超过数组本身的长度，都会导致数组进行扩容。
    */
    public static void main(String[] args) {


        /**
         * * 新增元素，数组长度加一，调用ensureCapacityHelper判断是否需要扩容，
         *      * 如果如要扩容，则:
         *      * 如果扩容系数大于0则，增加扩容系数的容量
         *      * 如果扩容系数小于0则，容量翻倍
         *      * 如果不需要扩容，则数组长度加一，然后在末尾赋值。
         */
        // 新建Vector
        Vector vec = new Vector();

        // 添加元素
        vec.add("1");
        vec.add("2");
        vec.add("3");
        vec.add("4");
        vec.add("5");

        // 设置第一个元素为100
        /**
         * 如果索引长度大于集合长度，则抛出Array index out of range:-index
         * 返回原索引位置的值，给索引位置赋值最新的值
         */
        vec.set(0, "100");

        // 将“500”插入到第3个位置
        /**
         * 索引大于元素个数，则报越界异常
         * 否则，判定是否需要扩容，如果需要扩容，则扩容，否则不扩容，
         * 然后将index及以后的数据向后依次移位，将新的值放到index的位置。
         */
        vec.add(2, "300");
        System.out.println("vec:"+vec);

        /**
         *
         * 先判定对象是否为空，如果为空，则从0到elementCount-1顺序查找是否有为空的元素，如果有则返回索引值。
         * 不为空，则0到elementCount-1顺序查找是否有与该元素相同的元素，如果有则返回该元素的索引值
         * 如果以上都不满足，则返回-1.
         */
        // (顺序查找)获取100的索引
        System.out.println("vec.indexOf(100):"+vec.indexOf("100"));

        // (倒序查找)获取100的索引
        /**
         * 索引大于元素个数，则报越界异常
         * 先判定对象是否为空，如果为空，则从elementCount-1到0倒叙查找是否有为空的元素，如果有则返回索引值。
         * 不为空，则elementCount-1到0倒序查找是否有与该元素相同的元素，如果有则返回该元素的索引值
         * 如果以上都不满足，则返回-1.
         */

        System.out.println("vec.lastIndexOf(100):"+vec.lastIndexOf("100"));

        /**
         * 如果元素为空，则抛出没有此元素的异常
         * 否则返回位置0的元素
         */
        // 获取第一个元素
        System.out.println("vec.firstElement():"+vec.firstElement());
        // 获取第3个元素
        /**
         * 索引大于元素个数，则报越界异常
         * 否则返回索引为２的元素
         */
        System.out.println("vec.elementAt(2):"+vec.elementAt(2));

        // 获取最后一个元素
        /**
         * 如果元素为空，则抛出没有此元素的异常
         * 否则返回elementCount-1的元素
         */
        System.out.println("vec.lastElement():"+vec.lastElement());

        /**
         * 返回elementCount
         */
        // 获取Vector的大小
        System.out.println("size:"+vec.size());
        // 获取Vector的总的容量
        /**
         * 返回elementCount.length
         */
        System.out.println("capacity:"+vec.capacity());

        // 获取vector的“第2”到“第4”个元素

        System.out.println("vec 2 to 4:"+vec.subList(1, 4));

        // 通过Enumeration遍历Vector
        Enumeration enu = vec.elements();
        while(enu.hasMoreElements())
            System.out.println("nextElement():"+enu.nextElement());

        Vector retainVec = new Vector();
        retainVec.add("100");
        retainVec.add("300");
        // 获取“vec”中包含在“retainVec中的元素”的集合
        System.out.println("vec.retain():"+vec.retainAll(retainVec));
        System.out.println("vec:"+vec);

        // 获取vec对应的String数组
        String[] arr = (String[]) vec.toArray(new String[0]);
        for (String str:arr)
            System.out.println("str:"+str);

        // 清空Vector。clear()和removeAllElements()一样！
        /**
         * 循环将所有元素都置为空，然后将数组长度置为0
         */
        vec.clear();
//        vec.removeAllElements();

        // 判断Vector是否为空
        System.out.println("vec.isEmpty():"+vec.isEmpty());



    }


}
